// import com.alibaba.druid.FastsqlException;
// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.io.IOException;
// import java.util.Collections;
// import java.util.List;
#pragma once
#include <list>
#include <sstream>
#include "../SQLExprImpl.h"
#include "../SQLReplaceable.h"

class SQLDataType;
class SQLIntervalUnit;
class SQLExpr;

class SQLIntervalExpr : public SQLExprImpl, virtual public SQLReplaceable
{
public:
  static SQLDataType_ptr DATA_TYPE;

  SQLExpr_ptr value;
  std::shared_ptr<SQLIntervalUnit> unit;

  SQLIntervalExpr();

  SQLIntervalExpr(SQLExpr_ptr value, std::shared_ptr<SQLIntervalUnit> unit);
  SHAREDOBJECT(SQLIntervalExpr);

  virtual SQLObject_ptr clone();

  //@Override
  BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target);

  SQLExpr_ptr getValue();

  void setValue(SQLExpr_ptr x);

  std::shared_ptr<SQLIntervalUnit> getUnit();

  void setUnit(std::shared_ptr<SQLIntervalUnit> unit);

  //@Override
  void output(std::stringstream *buf);

  void accept0(SQLASTVisitor_ptr visitor);

  //@Override
  SQLObject_list_ptr getChildren();

  //@Override
  int hashCode();

  //@Override
  bool equals(Object_ptr obj);

  SQLDataType_ptr computeDataType();
};
